package comp

// CompEvent 类型，表示计算事件的上下文
type CompEvent struct {
	ObjList []Iobject // 对象列表
	Param   []int64   // 变量列表
}

func NewCompEvent(objlist []Iobject, param []int64) *CompEvent {
	return &CompEvent{
		ObjList: objlist,
		Param:   param,
	}
}

func (et *CompEvent) AddObject(obj Iobject) {
	et.ObjList = append(et.ObjList, obj)
}
func (et *CompEvent) AddParam(val int64) {
	et.Param = append(et.Param, val)
}

// 获取变量的值
// 根据变量名计算其在 Param 数组中的索引，并返回对应的值
func (et *CompEvent) GetVal(cn *CompNode) (result int64) {
	if cn.Var == "" {
		return cn.Val
	} else {
		i := int(cn.Var[0] - Coust_a) //拿到变量索引
		if len(et.Param) > i {
			result = et.Param[i]
		}
	}
	return
}

// 获取对象的属性值
// 根据对象名查找 ObjList 中的对象，并返回指定属性的值
func (et *CompEvent) GetObjAttr(cn *CompNode) (result int64) {
	for i := range et.ObjList {
		if et.ObjList[i].GetObjName() == cn.Obj {
			return et.ObjList[i].GetAttr(cn.Var)
		}
	}
	return 0
}

func NewEventMap() *CompEventMap {
	return &CompEventMap{
		ObjList:   make(map[string]Iobject),
		ParamList: make(map[string]int64),
	}
}

type CompEventMap struct {
	ObjList   map[string]Iobject // 对象列表
	ParamList map[string]int64   // 参数列表
}

func (et *CompEventMap) AddObject(obj Iobject) {
	et.ObjList[obj.GetObjName()] = obj
}

func (et *CompEventMap) AddParam(name string, val int64) {
	et.ParamList[name] = val
}

func (et *CompEventMap) GetVal(cn *CompNode) (result int64) {
	if cn.Var == "" {
		return cn.Val
	} else {
		if val, ok := et.ParamList[cn.Var]; ok {
			result = val
		}
	}
	return
}

func (et *CompEventMap) GetObjAttr(cn *CompNode) (result int64) {
	for i := range et.ObjList {
		if et.ObjList[i].GetObjName() == cn.Obj {
			return et.ObjList[i].GetAttr(cn.Var)
		}
	}
	return 0
}
